{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Memory Based Collaborative Filtering Recommender\n",
    "\n",
    "The goal of the **recommender system** is to predict user preference for a set of items based on the past experience. Two the most popular approaches are Content-Based and Collaborative Filtering.\n",
    "\n",
    "**Collaborative filtering** is a technique used by websites like Amazon, YouTube, and Netflix. It filters out items that a user might like on the basis of reactions of similar users. There are two categories of collaborative filtering algorithms: memory based and model based.\n",
    "\n",
    "**Memory based algorithms** apply statistical techniques to the entire dataset to calculate the predictions. They can be divided into two main sections: user-item filtering and item-item filtering. The closest users or items are calculated only by using Cosine similarity or Pearson correlation coefficients, which are solely based on arithmetic operations.\n",
    "\n",
    "The goal of this exercise is to compare user-item and item-item approach, try different configurations of parameters, optimize model performance and explore obtained results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from surprise import Dataset, Reader\n",
    "from surprise import KNNBasic, KNNWithMeans, KNNWithZScore, KNNBaseline\n",
    "from surprise.model_selection import cross_validate, train_test_split, GridSearchCV\n",
    "\n",
    "import functions as f"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This analysis will focus on book recommendations based on [Book-Crossing dataset](http://www2.informatik.uni-freiburg.de/~cziegler/BX/). To reduce the dimensionality of the dataset and avoid running into memory error it will focus on users with at least 3 ratings and top 10% most frequently rated books. It consists of 176,594 records.\n",
    "\n",
    "The recommender systems will be built using [surprise package](https://surprise.readthedocs.io/en/stable/getting_started.html#getting-started) (KNN-based models)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('data/ratings_top.csv')\n",
    "\n",
    "reader = Reader(rating_scale=(1, 10))\n",
    "data = Dataset.load_from_df(df[['user_id', 'isbn', 'book_rating']], reader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of ratings: 176594\n",
      "Number of books: 16766\n",
      "Number of users: 20149\n"
     ]
    }
   ],
   "source": [
    "print('Number of ratings: %d\\nNumber of books: %d\\nNumber of users: %d' % (len(df), len(df['isbn'].unique()), len(df['user_id'].unique())))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## KNN Model Selection\n",
    "\n",
    "K-Nearest Neighbours algorithm calculates the distances between users or items and finds the closest ones = the most similar ones. Surprise package offers several variations of the model. The comparison of those models shows that KNNBaseline algorithm gives the best performance in terms of RMSE error and is not that time-consuming (compared to other models) when it comes to fitting it.\n",
    "\n",
    "KNNBaseline model will be tested in further analysis with different similarity metrics and hyperparameters as well as user-item and item-item approach."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "---> CV for KNNBasic msd...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "\n",
      "---> CV for KNNWithMeans msd...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "\n",
      "---> CV for KNNWithZScore msd...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "\n",
      "---> CV for KNNBaseline msd...\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>fit_time</th>\n",
       "      <th>model</th>\n",
       "      <th>test_mae</th>\n",
       "      <th>test_rmse</th>\n",
       "      <th>test_time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>18.759397</td>\n",
       "      <td>KNNBasic msd</td>\n",
       "      <td>1.496106</td>\n",
       "      <td>1.947808</td>\n",
       "      <td>4.292997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>22.443044</td>\n",
       "      <td>KNNWithMeans msd</td>\n",
       "      <td>1.366099</td>\n",
       "      <td>1.824922</td>\n",
       "      <td>4.715832</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>25.521179</td>\n",
       "      <td>KNNWithZScore msd</td>\n",
       "      <td>1.348834</td>\n",
       "      <td>1.817319</td>\n",
       "      <td>4.503368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20.381712</td>\n",
       "      <td>KNNBaseline msd</td>\n",
       "      <td>1.359369</td>\n",
       "      <td>1.783068</td>\n",
       "      <td>4.735185</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    fit_time              model  test_mae  test_rmse  test_time\n",
       "0  18.759397       KNNBasic msd  1.496106   1.947808   4.292997\n",
       "1  22.443044   KNNWithMeans msd  1.366099   1.824922   4.715832\n",
       "2  25.521179  KNNWithZScore msd  1.348834   1.817319   4.503368\n",
       "3  20.381712    KNNBaseline msd  1.359369   1.783068   4.735185"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "models1 = f.generate_models_dict([KNNBasic, KNNWithMeans, KNNWithZScore, KNNBaseline], ['msd'], True)\n",
    "results1 = f.cv_multiple_models(data, models1)\n",
    "models1 = None\n",
    "display(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "f.draw_model_results(results1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## User-Item Model Selection\n",
    "\n",
    "User-Item approach is to determine a set of the most similar users to the user U (based on their past ratings) and to calculate the rating for the item I based on the ratings assigned by those users.\n",
    "\n",
    "After conducting the test of different similarity metrics for KNNBaseline (user-item) algorithm, it's clear that Pearson correlation coefficient is the best both in terms of RMSE and MAE (alhough it's the least time efficient when fitting it)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "---> CV for KNNBaseline cosine...\n",
      "Estimating biases using als...\n",
      "Computing the cosine similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the cosine similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the cosine similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "\n",
      "---> CV for KNNBaseline msd...\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "\n",
      "---> CV for KNNBaseline pearson...\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>fit_time</th>\n",
       "      <th>model</th>\n",
       "      <th>test_mae</th>\n",
       "      <th>test_rmse</th>\n",
       "      <th>test_time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>36.068179</td>\n",
       "      <td>KNNBaseline cosine</td>\n",
       "      <td>1.365077</td>\n",
       "      <td>1.779240</td>\n",
       "      <td>5.213969</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>19.213364</td>\n",
       "      <td>KNNBaseline msd</td>\n",
       "      <td>1.358349</td>\n",
       "      <td>1.780808</td>\n",
       "      <td>4.560174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38.958784</td>\n",
       "      <td>KNNBaseline pearson</td>\n",
       "      <td>1.315616</td>\n",
       "      <td>1.704551</td>\n",
       "      <td>3.976375</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    fit_time                model  test_mae  test_rmse  test_time\n",
       "0  36.068179   KNNBaseline cosine  1.365077   1.779240   5.213969\n",
       "1  19.213364      KNNBaseline msd  1.358349   1.780808   4.560174\n",
       "2  38.958784  KNNBaseline pearson  1.315616   1.704551   3.976375"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "models2 = f.generate_models_dict([KNNBaseline], ['cosine', 'msd', 'pearson'], True)\n",
    "results2 = f.cv_multiple_models(data, models2)\n",
    "models2 = None\n",
    "display(results2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Item-Item Model Selection\n",
    "\n",
    "Item-Item approach is to determine a set of the most similar items to the item I (based on the past ratings of other users) and to calculate the rating for the item I based on the ratings of similar items rated by the user U.\n",
    "\n",
    "As before, Pearson correlation coefficient gives the best results in terms of both RMSE and MAE. By using item-item approach the results of the algorithm were improved compared to the previous iteration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "---> CV for KNNBaseline cosine...\n",
      "Estimating biases using als...\n",
      "Computing the cosine similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the cosine similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the cosine similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "\n",
      "---> CV for KNNBaseline msd...\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the msd similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "\n",
      "---> CV for KNNBaseline pearson...\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>fit_time</th>\n",
       "      <th>model</th>\n",
       "      <th>test_mae</th>\n",
       "      <th>test_rmse</th>\n",
       "      <th>test_time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>31.533477</td>\n",
       "      <td>KNNBaseline cosine</td>\n",
       "      <td>1.270213</td>\n",
       "      <td>1.691894</td>\n",
       "      <td>9.560889</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>16.385783</td>\n",
       "      <td>KNNBaseline msd</td>\n",
       "      <td>1.277724</td>\n",
       "      <td>1.705066</td>\n",
       "      <td>9.301719</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>53.911460</td>\n",
       "      <td>KNNBaseline pearson</td>\n",
       "      <td>1.253583</td>\n",
       "      <td>1.647738</td>\n",
       "      <td>9.555055</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    fit_time                model  test_mae  test_rmse  test_time\n",
       "0  31.533477   KNNBaseline cosine  1.270213   1.691894   9.560889\n",
       "1  16.385783      KNNBaseline msd  1.277724   1.705066   9.301719\n",
       "2  53.911460  KNNBaseline pearson  1.253583   1.647738   9.555055"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "models3 = f.generate_models_dict([KNNBaseline], ['cosine', 'msd', 'pearson'], False)\n",
    "results3 = f.cv_multiple_models(data, models3)\n",
    "models3 = None\n",
    "display(results3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "results2['model'] = 'USER ' + results2['model']\n",
    "results3['model'] = 'ITEM ' + results3['model']\n",
    "\n",
    "f.draw_model_results(pd.concat([results2, results3]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Memory Based Model Optimisation with GridSearch CV\n",
    "\n",
    "Grid Search Cross Validation computes accuracy metrics for an algorithm on various combinations of parameters, over a cross-validation procedure. It's useful for finding the best configuration of parameters.\n",
    "\n",
    "Iterating over different sets of parameters of KNNBaseline model shows that increasing k (the max number of neighbours to take into consideration in aggregation) and min_k (the minimum number of neighbors to take into account for aggregation) improves the RMSE score. At the same time, it's good to be aware that increasing those parameters extends the training time and may also lead to overfitting. The best set of parameters (in terms of RMSE) obtained by GridSearch:\n",
    "* KNNBaseline, item-item, Pearson similarity metric\n",
    "* k = 50\n",
    "* min_k = 5\n",
    "* min_support = 1\n",
    "\n",
    "Optimization of KNNBaseline model may additionally be extended by playing with baseline estimates configuration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "Estimating biases using als...\n",
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n",
      "1.607153664460527\n",
      "{'k': 50, 'min_k': 5, 'sim_options': {'name': 'pearson', 'min_support': 1, 'user_based': False}}\n"
     ]
    }
   ],
   "source": [
    "param_grid = {'k': [40,45,50],\n",
    "              'min_k': [1,3,5],\n",
    "              'sim_options': {'name': ['pearson'],\n",
    "                              'min_support': [1, 5],\n",
    "                              'user_based': [False]}\n",
    "              }\n",
    "gs = GridSearchCV(KNNBaseline, param_grid, measures=['rmse', 'mae'], cv=3)\n",
    "\n",
    "gs.fit(data)\n",
    "print(gs.best_score['rmse'])\n",
    "print(gs.best_params['rmse'])\n",
    "\n",
    "#1.607153664460527\n",
    "#{'k': 50, 'min_k': 5, 'sim_options': {'name': 'pearson', 'min_support': 1, 'user_based': False}}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Analysis of Collaborative Filtering model results\n",
    "\n",
    "In this part, let's examine in detail the results obtained by the KNN model that provided the best RMSE score."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Computing the pearson similarity matrix...\n",
      "Done computing similarity matrix.\n"
     ]
    }
   ],
   "source": [
    "trainset, testset = train_test_split(data, test_size=0.2)\n",
    "\n",
    "sim_options = {\n",
    "    'name': 'pearson',\n",
    "    'user_based': False,\n",
    "    'min_support': 1\n",
    "}\n",
    "\n",
    "model = KNNWithMeans(k=50, min_k=5, sim_options=sim_options)\n",
    "model.fit(trainset)\n",
    "predictions = model.test(testset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>isbn</th>\n",
       "      <th>actual_rating</th>\n",
       "      <th>pred_rating</th>\n",
       "      <th>k</th>\n",
       "      <th>impossible</th>\n",
       "      <th>pred_rating_round</th>\n",
       "      <th>abs_err</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1241</th>\n",
       "      <td>264027</td>\n",
       "      <td>0679445315</td>\n",
       "      <td>5.0</td>\n",
       "      <td>6.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30914</th>\n",
       "      <td>193740</td>\n",
       "      <td>0064471837</td>\n",
       "      <td>8.0</td>\n",
       "      <td>8.666667</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31284</th>\n",
       "      <td>21252</td>\n",
       "      <td>0345433491</td>\n",
       "      <td>6.0</td>\n",
       "      <td>7.894737</td>\n",
       "      <td>1</td>\n",
       "      <td>False</td>\n",
       "      <td>8.0</td>\n",
       "      <td>1.894737</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2241</th>\n",
       "      <td>11676</td>\n",
       "      <td>0440428130</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.714286</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.285714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24254</th>\n",
       "      <td>275827</td>\n",
       "      <td>0140071814</td>\n",
       "      <td>2.0</td>\n",
       "      <td>7.400000</td>\n",
       "      <td>0</td>\n",
       "      <td>False</td>\n",
       "      <td>7.0</td>\n",
       "      <td>5.400000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       user_id        isbn  actual_rating  pred_rating  k  impossible  \\\n",
       "1241    264027  0679445315            5.0     6.333333  0       False   \n",
       "30914   193740  0064471837            8.0     8.666667  0       False   \n",
       "31284    21252  0345433491            6.0     7.894737  1       False   \n",
       "2241     11676  0440428130            9.0     8.714286  0       False   \n",
       "24254   275827  0140071814            2.0     7.400000  0       False   \n",
       "\n",
       "       pred_rating_round   abs_err  \n",
       "1241                 6.0  1.333333  \n",
       "30914                9.0  0.666667  \n",
       "31284                8.0  1.894737  \n",
       "2241                 9.0  0.285714  \n",
       "24254                7.0  5.400000  "
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_pred = pd.DataFrame(predictions, columns=['user_id', 'isbn', 'actual_rating', 'pred_rating', 'details'])\n",
    "\n",
    "df_pred['k'] = df_pred['details'].apply(f.k_from_details)\n",
    "df_pred['impossible'] = df_pred['details'].apply(lambda x: x['was_impossible'])\n",
    "df_pred['pred_rating_round'] = df_pred['pred_rating'].round()\n",
    "df_pred['abs_err'] = abs(df_pred['pred_rating'] - df_pred['actual_rating'])\n",
    "df_pred.drop(['details'], axis=1, inplace=True)\n",
    "\n",
    "df_pred.sample(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Distribution of actual and predicted ratings in the test set\n",
    "\n",
    "According to the distribution of actual ratings of books in the test set, the biggest part of users give positive scores - between 7 and 10. The mode equals 8 but count of ratings 7, 9, 10 is also noticeable.\n",
    "The distribution of predicted ratings in the test set is visibly different. One more time, 8 is a mode but scores 7, 9 and 10 are clearly less frequent.\n",
    "\n",
    "It shows that the recommender system is not perfect and it cannot reflect the real distribution of book ratings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "palette = sns.color_palette(\"RdBu\", 10)\n",
    "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(14, 4))\n",
    "\n",
    "sns.countplot(x='actual_rating', data=df_pred, palette=palette, ax=ax1)\n",
    "ax1.set_title('Distribution of actual ratings of books in the test set')\n",
    "\n",
    "sns.countplot(x='pred_rating_round', data=df_pred, palette=palette, ax=ax2)\n",
    "ax2.set_title('Distribution of predicted ratings of books in the test set')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Absolute error of predicted ratings\n",
    "\n",
    "The distribution of absolute errors is right-skewed, showing that the majority of errors is small: between 0 and 1. There is a long tail that indicates that there are several observations for which the absolute error was close to 10.\n",
    "\n",
    "How good/bad the model is with predicting certain scores? As expected from the above charts, the model deals very well with predicting score = 8 (the most frequent value). The further the rating from score = 8, the higher the absolute error. The biggest errors happen to observations with scores 1 or 2 which indicates that probably the model is predicting high ratings for those observations. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_pred_err = df_pred.groupby('actual_rating')['abs_err'].mean().reset_index()\n",
    "\n",
    "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(14, 4))\n",
    "\n",
    "sns.distplot(df_pred['abs_err'], color='#2f6194', ax=ax1)\n",
    "ax1.set_title('Distribution of absolute error in test set')\n",
    "\n",
    "sns.barplot(x='actual_rating', y='abs_err', data=df_pred_err, palette=palette, ax=ax2)\n",
    "ax2.set_title('Mean absolute error for rating in test set')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Analysis of predicted ratings of a particular user\n",
    "\n",
    "For this part of the analysis, the user with id 204864 was selected. It can be noted that his rating behaviour is slightly different than the behaviour shown in scores' distribution of the whole population. He gives high scores often (7-10) and rating = 10 is the most frequent value.\n",
    "\n",
    "The distribution of predicted book ratings for this user differs a lot from the actual one. All predicted ratings are between 6-10 (which shows that the model is mistaken for the observation with score 5) and the most frequent rating is 8 (which implies that probably some of the observations with the real score = 10 have predicted rating lower than actual)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_books = pd.read_csv('data/books.csv')\n",
    "\n",
    "df_pred_ext = df_pred.merge(df_books[['isbn', 'book_title']], on='isbn', how='left')\n",
    "df_pred_ext['book_title_short'] = df_pred_ext['book_title'].apply(f.short_title)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Selected user: 204864\n",
    "selected_user_id = 204864\n",
    "\n",
    "df_pred_user = df_pred_ext[df_pred_ext['user_id']==selected_user_id]\n",
    "\n",
    "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(14, 4))\n",
    "\n",
    "sns.countplot(x='actual_rating', data=df_pred_user, palette=sns.color_palette(\"RdBu\", len(df_pred_user['actual_rating'].unique())), ax=ax1)\n",
    "ax1.set_title('Distribution of actual book ratings of a selected user')\n",
    "\n",
    "sns.countplot(x='pred_rating_round', data=df_pred_user, palette=sns.color_palette(\"RdBu\", len(df_pred_user['pred_rating_round'].unique())), ax=ax2)\n",
    "ax2.set_title('Distribution of predicted book ratings of a selected user')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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XLiw6lLUywYPHsyGG27IwIEDO72PoUeSJEkN5+GHH2bNNdekqamJiKi6HPWSzOSpp57i4YcfZuTIkZ3ez+FtkiRJajgLFy5knXXWMfD0MxHBOuus0+UePkOPJEmSGpKBp3/qzu/d0CNJkiT1cUOHDgXg0UcfZb/99mv3uaeeeiovvPDCkvvvec97eOaZZ3q0vr7O0CNJkiRV4NVXX+3yPuuvvz6XX355u89ZNvRceeWVDB8+vMvnqhNDjyRJkrSSzZs3j80335wpU6awzTbbsN9++/HCCy/Q1NTESSedxKRJk7jsssu477772H333Rk7diw77bQTd999NwD3338/O+64I+PHj+eLX/ziUsfdeuutgSI0ffKTn2TUqFFss802nHHGGZx++uk8+uijTJ48mcmTJwPQ1NTEk08+CcB3vvMdtt56a7beemtOPfXUJcfcYostOOqoo9hqq63YbbfdePHFF3uzuXpcj4WeiDgvIv4ZEX9q9djaEfH7iPhr+fdaPXV+SZIkqUr33HMPU6dOZc6cOQwbNoyzzjoLKJZcnjVrFgceeCBTp07ljDPOoLm5mVNOOYXjjjsOgBNPPJFjjz2W2267jTe84Q1tHn/atGncf//93H777cyZM4dDDjmEE044gfXXX59rr72Wa6+9dqnnNzc3c/7553PLLbdw88038/3vf5/bb78dgL/+9a98+MMf5s9//jPDhw/nZz/7WQ+2TO/ryZ6eC4Ddl3nss8A1mbkpcE15X5IkSaqdjTbaiIkTJwJw6KGHMmvWLAAOOOAAABYsWMCNN97I/vvvz5gxYzj66KN57LHHALjhhhs46KCDADjssMPaPP7VV1/NMcccw4ABxVVo1l577XbrmTVrFu9973tZY401GDp0KO973/u4/vrrARg5ciRjxowBYOzYscybN28FfvK+p8eu05OZMyOiaZmH9wF2KW//EJgBfKanapAkSZKqsuwqYy3311hjDQAWL17M8OHDueOOOzq1/7Iys0srmWXmcrcNGjRoye1VV121dsPbevvipK/PzMcAMvOxiFhveU+MiKnAVICNN964l8rrX65o/ltl537v2LdUdm5J6kljP3Vhpedv/vbh3d63yvcFaNz3BttNy/Pggw9y0003seOOO3LJJZcwadKkJcPJAIYNG8bIkSO57LLL2H///clM5syZw+jRo5k4cSKXXnophx56KBdddNFSx311cfKv5xcy6e2TOf3/zmT0+B0YMGAA/3r6adZae22GrDGUhx9/klVXL1Z8W5zJM88vZMz47fnw0VM5+iMfJTO5/Gc/5+wfnMv8F15ackyAF15+hRdfXrTkfmtrrTG4B1us5/TZhQwyc1pmjsvMcSNGjKi6HEmSJKlLtthiC374wx+yzTbb8PTTT3Psscf+23Muuugizj33XEaPHs1WW23F9OnTATjttNM488wzGT9+PPPnz2/z+IcdcSQbbrQRk7Yfz047TODyn/4EgClHfpAPvHcf9t7j3Us9f/SYbTno0EN559t34l277MxhRxzBNqPHrOSfum+K9rq5VvjgxfC2X2Xm1uX9e4Bdyl6eNwIzMnOzjo4zbty4nD17do/V2V/Z0yNJK589Pd3XqO8Ntls15s6dyxZbbFF1Gcs1b9489txzT/70pz91/OQuaqsHprf0lZ6etn7/EdGcmePaen5v9/T8AphS3p4CTO/l80uSJEnqZ3pyyepLgJuAzSLi4Yj4T+AbwLsi4q/Au8r7kiRJUq00NTX1SC+PuqcnV287aDmbdu2pc0qSJEnSsvrsQgaSJEmStDIYeiRJkiTVmqFHkiRJUq0ZeiRJkiTVWo8tZCBJkiT1lpV9vaSVff2jGTNmsNpqq/G2t72t28cYOnQoCxYsWOFavvPtb/HxT316yf1377oLV10zY4WP25fZ0yNJkiT1sBkzZnDjjTf2yrleffXVdrd/95RvLXW/7oEHDD2SJElSt+27776MHTuWrbbaimnTpgHw29/+lu22247Ro0ez6667Mm/ePM4++2y++93vMmbMGK6//nqOOOIILr/88iXHGTp0KAALFixg1113ZbvttmPUqFFMnz69U3XMmjmTvfd4N0cdOYWJE8YBcOiB+zN50tvYcdx2XHDeuQB89Utf4MUXX2TnHbdn6gePAGCj16+75Bh77b4bUw45iO23Hc3UDx5BZgLw+6t+y/bbjmbSpEmccMIJ7LnnniveeL3I4W2SJElSN5133nmsvfbavPjii4wfP5599tmHo446ipkzZzJy5Eiefvpp1l57bY455hiGDh3KJz/5SQDOPffcNo83ePBgrrjiCoYNG8aTTz7JDjvswN57701EdFjLH5tnc8OtzWzS1ATAGWedw1plbbvuPIm999mXL590Mj8452xm3nRLm8eYM+dObrytmTe+cX12f+dkbrnpRsZsN5aPnXA8v77qasZstTkHHbS8y3H2XYYeSZIkqZtOP/10rrjiCgAeeughpk2bxs4778zIkSMBWHvttbt0vMzkv/7rv5g5cyarrLIKjzzyCI8//jhveMMbOtx3u7HjlgQegHO+dxa//uUvAHjkkYe5776/sfY663R4jA022BCAUaNG8+CDD7LG0KE0NY1ccuyDDjpoSa9WozD0SJIkSd0wY8YMrr76am666SaGDBnCLrvswujRo7nnnns63HfAgAEsXrwYKILOyy+/DMBFF13EE088QXNzMwMHDqSpqYmFCxd2qp4ha6yx5PasmTO5bsYfuOoPMxgyZAh77b4bLy18qcNjDBo0aMntVVddhUWLFi0Z4tbInNMjSZIkdcP8+fNZa621GDJkCHfffTc333wzL730Etdddx33338/AE8//TQAa665Js8999ySfZuammhubgZg+vTpvPLKK0uOud566zFw4ECuvfZaHnjggW7V9uyz8xk+vKjt3nvuYfZtty7ZNmDgwCXn64xN37oZ8+bdz4NlLT/5yU+6VVOV7OmRJElSw1vZS0x3xu67787ZZ5/NNttsw2abbcYOO+zAiBEjmDZtGu973/tYvHgx6623Hr///e/Za6+92G+//Zg+fTpnnHEGRx11FPvssw8TJkxg1113ZY2yl+aQQw5hr732Yty4cYwZM4bNN9+8W7Xt+q7dOP/cHzBp+/G8ZdNNGTd+wpJtU478IJO2H8/oMWOYdt4FHR5r9dVX55Tvnsb+++7NeuuNYMKECR3u09dEI3RXjRs3LmfPnl11GbWzstez74oq/mOSpN4w9lMXVnr+5m8f3u19q3xfgMZ9b7DdqjF37ly22GKLqsuoxL+e79xwt5VpwYIFDB06lOFDBvHhD3+YTTfdlI997GO9XkeLtn7/EdGcmePaer7D2yRJkiS168ILzmPnHbdnq622Yv78+Rx99NFVl9QlDm+TJEmSGsRdd93FwYccutRjqw1ajatnXN+j5z3u+BM47vgTWGuNwT16np5i6JEkSZIaxKhRo5Z7jR0tn8PbJEmSJNWaoUeSJElSrRl6JEmSJNWaoUeSJElSrbmQgSRJkhreyr5G1opc86q7hg4dyoIFC1b4ON/59rf4+Kc+veT+u3fdhauumbHCx63CymoTe3okSZKk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\n",
      "text/plain": [
       "<Figure size 1008x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_pred_sample = df_pred_user[df_pred_user['pred_rating_round'].notna()].sample(10)\n",
    "df_pred_sample = pd.melt(df_pred_sample[['book_title_short', 'actual_rating', 'pred_rating_round']], id_vars='book_title_short', var_name='prediction', value_name='rating')\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(14, 6))\n",
    "\n",
    "sns.barplot(x='book_title_short', y='rating', hue='prediction', data=df_pred_sample, palette=sns.color_palette(\"Paired\"))\n",
    "ax.set_title('Actual and estimated ratings of books')\n",
    "plt.xticks(rotation=90)\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "master",
   "language": "python",
   "name": "master"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
